#include <iostream>
#include <sys/types.h>
#include <unistd.h>       
#include <sys/wait.h>
#include <signal.h>
using namespace std;

void showSignal(sigset_t* set) // 打印block，pending的位图
{
    for (size_t i = 1; i < 32; i++)
    {
        if(sigismember(set, i))
        cout << 1;
        else
        cout << 0;
    }
    cout << endl;
}
void myhandler(int sig)
{
    cout << "sig:" << sig << endl;
    // 测试pend在此函数的初始状态
    sigset_t pending;
    showSignal(&pending);
    cout << "------------------" << endl;
}
void control_signal()  // 设置内核信号状态结构体
{
    // 自定义捕捉
    signal(2, myhandler);

    sigset_t set, oset;
    sigemptyset(&set);
    sigemptyset(&oset);

    // 捕捉SIGINT信号
    sigaddset(&set, 2);
    sigprocmask(SIG_SETMASK, &set, &oset);  // 通过set设置本进程的信号集
    
    int count = 0;

    // 测试pend在此函数的初始状态
    sigset_t pend;
    showSignal(&pend);
    cout << "------------------" << endl;

    sigemptyset(&pend);

    while(1)
    {
        showSignal(&pend);
        // if(count++ == 10)
        // {
        //     sigprocmask(SIG_SETMASK, &oset, &set);
        // }

        sigpending(&pend);
        if(count++ == 10)
        {
            sigprocmask(SIG_UNBLOCK, &set, &oset);
        }
        sleep(1);
    }
}
void test_code_dump() // 观察code_dump的状态
{
    int pid = fork();
    if(pid == 0) // 子进程
    {
        // int *p = nullptr;
        // *p = 10;

        // int a = 5;
        // a /= 0;
        exit(3);
    }
    int status = 0;
    waitpid(pid, &status, 0);
    cout << "status:" << status << endl;
    cout << "exit code:" << ((status >> 8 ) & 0xff) << endl;
    cout << "code signal:" << (status & 0x7f) << endl;
    cout << "code dump:" << ((status >> 7) & 0x1) << endl;
}
int main()
{
    control_signal();
    return 0;
}